package com.yj.springbootstudy.mulThread.imooc;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 创建两个线程，创建方式自选；
 * 两个线程同时执行代码逻辑；
 * 代码逻辑使用 boolean tryLock () 方法，如果获取到锁，执行打印当前线程名称，并沉睡 5000 毫秒；如果未获取锁，则打印 timeout，并处理异常信息；
 * 观察结果并进行分析；
 * 修改代码，使用 boolean tryLock (long time, TimeUnit unit) 方法，设置时间为 4000 毫秒；
 * 观察结果并进行分析；
 * 再次修改代码，使用 boolean tryLock (long time, TimeUnit unit) 方法，设置时间为 6000 毫秒；
 * 观察结果并进行分析。
 */
public class Demo02 {

    static Lock lock = new ReentrantLock();

    public static void main(String[] args) throws Exception {
            Thread t1 = new Thread(()->{
                try {
                    if (lock.tryLock(6000,TimeUnit.MILLISECONDS)){
                        System.out.println("当前线程："+Thread.currentThread().getName()+"获取到锁");
                        Thread.sleep(5000);

                    }else {
                        System.out.println("当前线程："+Thread.currentThread().getName()+"获取锁超时！");
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    lock.unlock();
                }
            },"t1");

        Thread t2 = new Thread(()->{
            try {
                if (lock.tryLock(6000,TimeUnit.MILLISECONDS)){
                    System.out.println("当前线程："+Thread.currentThread().getName()+"获取到锁");
                     Thread.sleep(5000);

                }else {
                    System.out.println("当前线程："+Thread.currentThread().getName()+"获取锁超时！");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        },"t2");

       t1.start();
       t2.start();
       t1.join();
       t2.join();

        System.out.println("end");

    }
}
